/*
 * Questa classe rappresenta il traffico scambiato tra 2 AS.
 */

using namespace std;

class TrafficLink
{
    private:
	int ASOrigin;           //uso un intero che sarebbe l'indice del vettore degli AS,
	int ASDestination;      //non metto direttamente l'oggetto AS, che creerebbe ridondanza
    map <string, int> mappa;
	bool state;

	public:
	TrafficLink();
	TrafficLink(int ASOrigin, int ASDestination, bool state);
	int getASOrigin();
	int getASDestination();
	int getTraffic(string key);
	int getTraffic();
	bool setTraffic(string key, int value, bool state);
	bool addTraffic(string key, int value);
	bool subTraffic(string key, int value);
	bool removeTraffic(string key, int value);
	map<string, int> getTraffics();
	bool getState();
	bool setState(bool state);
};

TrafficLink::TrafficLink()
{;}

TrafficLink::TrafficLink(int ASOrigin, int ASDestination, bool state)
{
	this->ASOrigin = ASOrigin;
    this->ASDestination = ASDestination;
    this->state = state;
    mappa.insert ( pair<string,int>("web",0) );
    mappa.insert ( pair<string,int>("voip",0) );
    mappa.insert ( pair<string,int>("p2p",0) );
    mappa.insert ( pair<string,int>("dos",0) );	
    //mappa.insert ( pair<string,int>("ftp",0) );
    //mappa.insert ( pair<string,int>("streaming",0) );
    //mappa.insert ( pair<string,int>("mail",0) );
}

int TrafficLink::getASOrigin()
{
    return this->ASOrigin;
}

int TrafficLink::getASDestination()
{
    return this->ASDestination;
}

bool TrafficLink::setTraffic(string key, int value, bool state)
{
    mappa[key] = value;
    this->state = state;
}

bool TrafficLink::addTraffic(string key, int value)
{
    mappa[key] = mappa[key] + value;
}

bool TrafficLink::subTraffic(string key, int value)
{
    mappa[key] = mappa[key] + value;
}

bool TrafficLink::removeTraffic(string key, int value)
{
    mappa[key] = mappa[key] - value;
    if (mappa[key] < 0)
        mappa[key] = 0;
}

int TrafficLink::getTraffic(string key)
{
    return mappa[key];
}

int TrafficLink::getTraffic()
{
    int x = 0;
    map<string,int>::iterator it;
    for (it=mappa.begin(); it != mappa.end(); it++)
        x = x + (*it).second;
    return x;
}

bool TrafficLink::getState()
{
    return this->state;
}

bool TrafficLink::setState(bool state)
{
    this->state = state;
}
